Pressidian
花园入口
笔记
项目
关于
实验室
GitHub
花园入口
笔记
项目
关于
实验室
GitHub

KNOWLEDGE PATHS

笔记库
当前位置
笔记库/前端/工程化/构建打包/Vite

public与assets的区别 ⌚️

3 分钟阅读 · Note

目录树 578 篇

            • 常见问题
            • public与assets的区别 ⌚️
            • Vite
          • 打包优化
          • ESbuild
          • Rollup
          • Vite与Webpack的区别
      • 前端技术栈
    • 笔记目录
    • CLAUDE.md
    • Vue 组件与 Render 函数

关联笔记 6

↗常见问题同一路径↗Vite同一路径↗打包优化共同主题↗打包原理共同主题↗魔法注释Magic Comments共同主题↗ESbuild共同主题

在 Vite 项目中,public 和 src/assets(或 src 下的其他静态资源目录)是存放静态资源的两个核心位置。它们在构建工具的处理方式、引用路径以及适用场景上有着本质的区别。

以下是它们的主要区别:

1. 构建处理方式

  • public 目录:该目录下的资源不会经过 Vite 的构建处理。在打包时,这些文件会被原封不动地直接复制到输出目录(通常是 dist)的根目录下,文件名保持不变,不会被压缩、转译或添加哈希后缀。
  • src 目录(如 src/assets):该目录下的资源会被 Vite 视为模块依赖并纳入构建管道。在打包时,Vite 会对它们进行优化处理,例如图片压缩、重命名并追加哈希值(如 logo.a1b2c3.png),以支持长效缓存和减小文件体积。

2. 引用与访问路径

  • public 目录:必须使用根绝对路径来引用。例如,public/icon.png 在代码中应写为 /icon.png。如果在 JS/TS 中使用相对路径或字符串拼接引用,可能会因为构建后路径固定而导致开发环境与生产环境不一致的问题。
  • src 目录:推荐使用相对路径或通过 import 语句显式导入。对于动态生成的路径,不能直接拼接字符串,而需要使用 new URL(path, import.meta.url) 或 import.meta.glob API 来处理,以确保 Vite 能在构建时正确解析资源。

3. 适用场景

  • public 目录:适合存放完全不需要构建处理的“原生资源”。典型场景包括:
    • 网站图标(favicon.ico)、PWA 清单(site.webmanifest)、搜索引擎爬虫配置(robots.txt)等。
    • 必须保持原有文件名的资源(如供用户下载的 PDF 手册)。
    • 需要通过固定绝对路径直接访问的资源,或在 HTML 模板中通过 <script> 标签引入的第三方 SDK 脚本。
  • src 目录:适合存放项目内部业务强相关的资源。典型场景包括:
    • 组件中引用的图片、样式表、字体等。
    • 需要被 Vite 压缩和优化以提升网页加载速度的媒体文件。
    • 需要在 JavaScript/TypeScript 中作为模块导入使用的资源。

总结对比

特性public 目录src 目录 (如 src/assets)
处理方式不处理,原样复制到 dist 根目录经过 Vite 处理,可能压缩、哈希化
引用方式必须使用根绝对路径(如 /img.png)使用相对路径或 import 导入
文件名保持原样,无哈希值默认追加哈希值,利于缓存
适用资源favicon、robots.txt、第三方库脚本等业务图片、CSS、字体、需优化的媒体文件等

简单来说,一个实用的原则是:需要 Vite 帮你处理(如哈希缓存、压缩)的资源放 src/assets;完全静态、需要原样复制且路径固定的资源放 public。


需要我补充一下在开发环境(Vite dev)和生产环境(Vite build)中,这两个目录的资源访问路径差异吗?实际开发中很容易踩坑。